package OODay03_Day09;
//抽象 接口 引用类型数组
public class Day09 {
    public static void main(String[] args) {
        //抽象类
        //设计规则(初学 共三点):
        //1 将<所有>派生类共有的属性和行为 抽到<超类>中------抽共性
           //行为即方法
        //2 若派生类的行为/代码都一样 设计普通方法
          //若派生类的行为/代码不一样 设计抽象方法
        //3 (接口)将<部分>派生类共有的行为 抽到<接口>中

        //抽象方法
        //由abstract修饰 只有方法的定义 没有具体的实现(连{}都没有)
        //不完整 缺少方法体

        //设计抽象方法的原因
        //真实项目都是团队完成的
        //1 假设不设计抽象方法
        //张三设计Dog类 吃饭方法为eat
        //李四设计Fish类 吃饭方法为eating
        //王五设计Chick类 吃饭方法为have
        //赵六想让动物吃饭 需要记三个名字 还要和动物名一一对应
        //2 假设设计抽象方法eat表示吃
        //张三Dog类 吃的方法只能是eat 且必须重写
        //其余人同理...

        //意义 设计抽象方法 为了统一命名

        //抽象类
        //1 包含抽象方法的类必须是抽象类,抽象类由abstract修饰
        // 抽象方法不完整 意味着抽象类也是不完整的
        //2 抽象类不能被实例化(new对象)------单独存在没有意义
        // 但是可以被声明 例如Animal animal=new Animal();等号以后是错误的
        //3 抽象类都是需要被子类继承的
        // 派生类:
           //1 也声明为抽象类 但是意味着派生类也需要被继承才能用(一般不这么用)
           //2 (常规做法)重写所有的抽象方法---变不完整为完整

        //抽象类的意义
        //抽象类一定是父类 用于封装共有的属性和行为---实现代码复用
        //可以包含抽象方法:
           //为派生类提供统一入口---名字统一
           //所有方法强制必须重写

        /**补充 抽象
        包含抽象方法的类必须是抽象类
        Java规定 不包含抽象方法的类 也可以声明为抽象类 只要是抽象类就不能被实例化(很少这么用 但是语法是允许的)*/

        //接口(重点)
        //接口的应用
        //1 接口是对继承单根性的扩展------实现多继承
        //(Java若允许多继承 接口没有意义<干爹>)
        //2 接口是一种标准 规范 常常用于表述具备某种功能(例如USB接口)
           //实现了某接口就具备某个功能 不实现接口就不具备该功能

        //接口的语法
        //引用类型 1 数组 2 类 3 接口 4 枚举 //引用类型之间是并列关系
        //由interface定义
        //就目前内容而言 只能包含抽象方法( 常量 默认方法 静态方法 私有方法 )
        //接口中的方法 默认是公开的 抽象的 前面默认有public abstract ; public abstract可以省略
           //类中不行 只有接口中有默认抽象方法的概念
        /**interface Inter{
            public abstract void show();
            void show();
        }*/
        //接口不能被实例化(new对象) 因此也需要被实现(实际上就是继承)
        //接口也是需要被实现<implements>的 实现类(实际上就是派生类)必须重写接口中的所有抽象方法
           //注意 重写接口中的方法时 必须加<public>修饰

        //接口的特点
        //Java规定 只能继承一个超类 但是可以实现多个接口 以逗号分割

        //若想继承又实现 必须先继承后实现

        //接口不能被实例化 但是可以声明 引用

        //接口可以继承接口
           //类与类______继承
           //接口与接口___继承
           //接口与类_____实现

        /**需求
        教研总监 名字 年龄 工资 上班打卡() 下班打卡() 完成工作()
               解决企业问题() 培养企业员工() 编辑书籍()
        讲师 名字 年龄 工资 上班打卡() 下班打卡() 完成工作()
               解决企业问题() 培养企业员工() 编辑书籍()
        项目经理 名字 年龄 工资 上班打卡() 下班打卡() 完成工作()
               编辑书籍()
        班主任 名字 年龄 工资 上班打卡() 下班打卡() 完成工作()
        设计
        父类 接口 子类*/
        /**
         * 超类 企业类 名字 年龄 工资 上班打卡() 下班打卡() <abstract 完成工作()> 无参构造 3参构造
         * 接口1类 解决企业问题() 培养企业员工()
         * 接口2类 编辑书籍()
         * 派生类 教研总监类 继承企业类 实现接口1,2类 super构造
         * 派生类 讲师类 继承企业类 实现接口1,2类 super构造
         * 派生类 项目经理类 继承企业类 实现接口2类 super构造
         * 派生类 班主任 继承企业类 super构造
         * */

        //接口特点 短小精悍 有时候接口里甚至一个方法也没有


        //引用类型数组(数组本质类型就是引用类型 元素是基本类型就为基本类型数组 反之为引用类型数组)
        //数组的元素是引用类型的数组
        //Dog[] dogs=new Dog[3];
        //意为 声明了一个Dog类型数组 包含三个元素 每个元素都是Dog类 元素大小都为null

        //引用类型数组与基本类型数组 有两点区别
        //1 给引用类型数组的元素赋值时 需要new个对象
        //2 访问引用类型数组元素的属性/行为时 需要打点访问
        //System.out.println(dogs[0].swim());------输出第一只狗狗的游泳行为

        //null补充
        //null表示空 没有指向任何对象
           //若引用的值为null 则该引用不能再进行任何操作了 若继续操作 则会产生NullPointException
           //称为空指针异常
    }
}
